/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes.Potrosa;

import java.awt.*;
import java.io.*;
import java.util.*;
import futbol.tacticas.concursantes.*;
import futbol.tacticas.*;

/**
 *
 * @author IGadea
 */
public class TacticaPotrosa implements Tactica {

    private int fuerza[] = {7,7,7,7,7,7,7,7,7,7,7};

    private Point posicionDeSaque[] = {
        new Point(-150,  15),
        new Point(-150,   0),
        new Point(-150, -15),
        new Point(-100, -40),
        new Point( -90,   0),
        new Point(   0,  40),
        new Point(   0, -40),
        new Point(  40, -30),
        new Point(  60,   0),
        new Point( 100, -40),
        new Point( 100,  40),
    };

    private Point tacticaAtacante[] = {
        new Point(-150,   0), //1
        new Point( -70,  70), //2
        new Point( -70, -70), //3
        new Point( -40, -40), //4
        new Point( -40,  40), //5
        new Point(   0,   0), //6
        new Point(  40, -40), //7
        new Point(  40,  40), //8
        new Point(  45,  80), //9
        new Point(  45, -80), //10
        new Point(  65,   0), //11
    };

    private Point tacticaDefensiva[] = {
        new Point(-150,   0), //1
        new Point( -90,  70), //2
        new Point( -90, -70), //3
        new Point( -70, -40), //4
        new Point( -70,  40), //5
        new Point( -30,   0), //6
        new Point(  10, -40), //7
        new Point(  10,  40), //8
        new Point(  25,  80), //9
        new Point(  25, -80), //10
        new Point(  55,   0), //11
    };

    private Jugador.TIPO roles[] = {
        Jugador.TIPO.GUARDAMETA,
        Jugador.TIPO.DEFENSA,
        Jugador.TIPO.DEFENSA,
        Jugador.TIPO.MITAD,
        Jugador.TIPO.MITAD,
        Jugador.TIPO.MITAD,
        Jugador.TIPO.MITAD,
        Jugador.TIPO.MITAD,
        Jugador.TIPO.DELANTERO,
        Jugador.TIPO.DELANTERO,
        Jugador.TIPO.DELANTERO
    };

    private Observador observador = Observador.instancia();
    private Entrenador entrenador = new Entrenador();
    private Jugador misJugadores[] = new Jugador[11];

    public TacticaPotrosa() {
        observador.reset();
        for (int i=0; i<11; i++) {
            misJugadores[i] = new Jugador(i, fuerza[i], entrenador);
            misJugadores[i].alineacion(tacticaDefensiva[i], tacticaAtacante[i]);
            misJugadores[i].cambiarRol(roles[i]);
        }
    }

    public Color getColor1() {
        return Color.GREEN;
    }

    public Color getColor2() {
        return Color.BLUE;
    }

    public Color getColorNumero() {
        return Color.WHITE;
    }

    public String getNombre() {
        return "Potrosa FC";
    }

    public int getXInicial(int n) {
        return posicionDeSaque[n].x;
    }

    public int getYInicial(int n) {
        return posicionDeSaque[n].y;
    }

    public int getFuerza(int n) {
        return fuerza[n];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com = new Vector();

        try {
            // Obtener parametros basicos
            Point bola = sj.getBola();
            Point jugadores[]=sj.getMisJugadores();
            Point contrarios[]=sj.getContrario();

            // Guardar las nuevas posiciones devueltas por el sistema.
            for (int n=0; n<11; n++)
                misJugadores[n].guardarPosicion(jugadores[n]);

            // Elegir los movimientos en funcion del estado del juego.
            observador.estadoDeJuego(bola, misJugadores, contrarios);
            entrenador.dirigirJugadores(misJugadores);

            // Guardar en el vector los movimientos elegidos.
            for (int n=0; n<11; n++) {
                Point donde = new Point();

                if (misJugadores[n].posicionDestino(donde));
                    com.add(new ComandoIrA(n, donde.x, donde.y));
                if (misJugadores[n].tirandoAPuerta()) {
                    // Disparo a puerta con todas las fuerzas, a veces el comando TirarAPuerta falla en eso.
                    MathVector mv = new MathVector(observador.posicionBalon(), new Point(160, 0));
                    Point lugar = observador.puntoDistante(mv, 1000, false);
                    com.add(new ComandoGolpearBola(n, lugar.x, lugar.y));
                } else if (misJugadores[n].golpeandoBalon(donde))
                    com.add(new ComandoGolpearBola(n, donde.x, donde.y));
            }
        } catch(Exception ex) {
            for (int i=0; i<11; i++)
                com.add(new ComandoTiroAPuerta(i, 0));
        }
        
        return com;
    }
}
